//请求前缀
var baseURL = "http://localhost:666";
//获取域名
host = window.location.host;
//获取页面完整地址
url = window.location.href;
//登录token
var token = localStorage.getItem("token");
//如果登录token为null，表示用户未登录
if(token == null && url.indexOf("login.html")==-1){
    //跳转到登录页面
    parent.location.href = '/login.html';
}

//RSA加密公钥
var rsaPublicKey;

var basePath = getRootPath();
console.log("basePath="+basePath);
var contextPath = getContextPath();
console.log("contextPath="+contextPath);

/**
 * 获取项目根目录
 * @returns {string}
 */
function getRootPath() {
    var pathName = window.location.pathname.substring(1);
    var webName = pathName == '' ? '' : pathName.substring(0, pathName.indexOf('/'));
    if (webName == "") {
        return window.location.protocol + '//' + window.location.host;
    }
    else {
        return window.location.protocol + '//' + window.location.host + '/' + webName;
    }
}

function getContextPath(){
    var pathName = window.location.pathname.substring(1);
    var webName = pathName == '' ? '' : pathName.substring(0, pathName.indexOf('/'));
    return webName;
}

/*
 *randomWord 产生任意长度随机字母数字组合
 *randomFlag-是否任意长度 min-任意长度最小位[固定位数] max-任意长度最大位
 * 生成3-32位随机串：randomWord(true, 3, 32)
 * 生成43位随机串：randomWord(false, 43)
 */
function randomWord(randomFlag, min, max){
    var str = "",
        range = min,
        arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

    // 随机产生
    if(randomFlag){
        range = Math.round(Math.random() * (max-min)) + min;
    }
    for(var i=0; i<range; i++){
        pos = Math.round(Math.random() * (arr.length-1));
        str += arr[pos];
    }
    return str;
}

/**
 * 在页面中任何嵌套层次的窗口中获取顶层窗口
 * @return 当前页面的顶层窗口对象
 */
function getTopWinow(){
    var p = window;
    while(p != p.parent){
        p = p.parent;
    }
    return p;
}

/**
 * AES加密
 * @param word 需要加密的内容
 * @param aesKey 加密密钥
 * @returns {*}
 * @constructor
 */
function encrypt(word,aesKey){
    var key = CryptoJS.enc.Utf8.parse(aesKey);
    var srcs = CryptoJS.enc.Utf8.parse(word);
    var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
    return encrypted.toString();
}

/**
 * AES解密
 * @param word 需要解密的内容
 * @param aesKey 解密密钥
 * @returns {*}
 */
function decrypt(word,aesKey){
    var key = CryptoJS.enc.Utf8.parse(aesKey);
    var decrypt = CryptoJS.AES.decrypt(word, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
    return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}

/**
 * 判断是否为Base64字符串
 * @param str
 */
function isBase64Str(str){
    var pattern = /[A-Za-z0-9\+\/\=]$/;
    return pattern.test(str);
}

/**
 * 判断是不是Json字符串
 * @param str
 * @returns {boolean}
 */
function isJsonStr(str){
    try{
        var obj = eval('(' + str + ')');
        console.log(str+"是json字符串");
        return true;
    }
    catch(e){
        console.log(str+"不是json字符串");
        return false;
    }
}


//jquery全局配置
$.ajaxSetup({
	dataType: "json",//设置服务端的数据以json的格式返回
	cache: false,
    layerIndex:-1,
    data:{},//定义一个空参数对象，避免arguments[1].data获取请求参数时出现undefined
    beforeSend:function(xhr) {//发送AJAX请求前触发
        //console.log("beforeSend→arguments");
        //console.log(arguments);//我们先来看看arguments这里面有啥东西
        var paramData = arguments[1].data;//得到发送AJAX请求时的原始参数
        console.log("beforeSend→未加密之前AJAX请求的原始参数为：");
        console.log(paramData);
        var paramObj = {};
        var aesKey = randomWord(false,16);//生成16位AES加密密钥
        console.log("用于进行AES加密的密钥为："+aesKey);
        for(var prop in paramData){
            //将参数进行AES加密
            paramObj[prop] = encrypt(paramData[prop],aesKey);
        }
        console.log("beforeSend→加密处理之后AJAX请求的参数为：");
        console.log(paramObj);
        console.log("beforeSend→添加公共参数ajaxRequest、token、aesKey");
        paramObj.ajaxRequest="yes";
        paramObj.token = encrypt(token,aesKey);//进行AES加密
        if(rsaPublicKey != null){
            paramObj.aesKey = RSAUtils.encryptedString(rsaPublicKey,aesKey);//将AES加密密钥采用RSA加密后再传递到服务端
        }else{
            paramObj.aesKey = aesKey;
        }
        console.log("AES加密的密钥使用RSA加密后："+paramObj.aesKey);
        console.log("beforeSend→往paramObj添加了ajaxRequest、token、aesKey这三个公共参数之后");
        console.log(paramObj);
        console.log("beforeSend→调用$.param()方将paramObj对象序列化");
        /**
         * $.param()方法是用来对一个数组或对象按照key/value进行序列化。
         */
        arguments[1].data = $.param(paramObj);//将序列化后的参数重新赋值给arguments[1].data
        console.log(arguments[1].data);
        //Ajax全局加载框(Loading效果)的配置
        this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
    },
    /**
     * processData 默认值: true。默认情况下，通过data选项传递进来的数据，如果是一个对象(技术上讲只要不是字符串)，
     * 都会处理转化成一个查询字符串，以配合默认内容类型 "application/x-www-form-urlencoded"。
     * 如果要发送 DOM 树信息或其它不希望转换的信息，请设置为 false。
     */
    processData: false,//默认是true
    /**
     * 给 Ajax 返回的原始数据的进行预处理的函数。提供 data 和 type 两个参数
     * @param data Ajax 返回的原始数据
     * @param type 调用 jQuery.ajax 时提供的 dataType 参数
     * @returns {*}
     */
    dataFilter: function(data,type) {
        //console.log("dataFilter→arguments");//先看看里面有什么参数
        //console.log(arguments);
        console.log("dataFilter→服务端返回的原始数据(data)");
        console.log(data);//这是我的一个习惯，拿到一个函数之后，管他是什么东西，先看看里面有什么参数
        console.log("dataFilter→type ="+type);
        if(data!=""){
            var newData = $.parseJSON(data);//json字符串转json对象
            console.log("dataFilter→将服务端返回的原始数据(data)转成Json对象(newData)");
            console.log(newData);
            var dataObj = {};
            dataObj.code = newData.code;//响应状态码
            if(newData.hasOwnProperty("aesKey")){
                var aesKey = newData.aesKey;//数据解密密钥
                console.log("aesKey="+aesKey);
                //var exponent = localStorage.getItem("exponent");
               // var modulus = localStorage.getItem("modulus");
                //根据exponent和modulus生成RSA解密私钥
                //var tmpRsaPrivateKey = RSAUtils.getKeyPair('', exponent, modulus);
                //aesKey = RSAUtils.decryptedString(tmpRsaPrivateKey,aesKey);
                //console.log("使用RSA公钥解密Aes加密密钥，aesKey="+aesKey);
                for (var key in newData) {
                    if(key=="aesKey" || key=="code"){
                        continue;
                    }
                    if(isBase64Str(newData[key])){
                        //解密数据
                        var decryptData = decrypt(newData[key],aesKey);
                        if(isJsonStr(decryptData)){
                            dataObj[key] = $.parseJSON(decryptData);
                        }else{
                            dataObj[key] = decryptData;
                        }
                    }else{
                        if(isJsonStr(newData[key])){
                            dataObj[key] = $.parseJSON(newData[key]);
                        }else{
                            dataObj[key] = newData[key];
                        }
                    }
                }
                var dataJsonStr = JSON.stringify(dataObj);
                console.log("解密后的数据(dataJsonStr)");
                console.log(dataJsonStr);
                //返回处理过后的数据
                return dataJsonStr;
            }else{
                //返回原始数据
                return data;
            }
        }else{
            return data;
        }
   },
    error: function (XMLHttpRequest, textStatus, errorThrown){//请求失败遇到异常触发
        layer.msg('Ajax请求错误！', {icon: 1});
        return false;
    },
    complete:function(XMLHttpRequest,textStatus){//请求完成时运行的函数（在请求成功或失败之后均调用，即在 success 和 error 函数之后）
        //关闭loading框
        layer.close(this.layerIndex);
        var sessionStatus=XMLHttpRequest.getResponseHeader("SessionStatus"); //通过XMLHttpRequest取得响应头,sessionStatus，
        if(sessionStatus=='timeout'){
            //如果超时就处理 ，指定要跳转的页面
            var top = getTopWinow(); //获取当前页面的顶层窗口对象
            top.layer = layer;
            top.layer.alert("尊敬的用户，页面已经过期，请重新登录",
                {
                    icon:5,
                    title:"温馨提示",
                    closeBtn:0//不显示弹出框右上角的关闭按钮
                },
                function(){
                    //删除本地token
                    localStorage.removeItem("token");
                    top.location.href='/login.html'; //跳转到登录页面
                });
        }
    }
});

//权限判断
function hasPermission(permission) {
    if (window.parent.permissions.indexOf(permission) > -1) {
        return true;
    } else {
        return false;
    }
}

//判断是否为空
function isBlank(value) {
    return !value || !/\S/.test(value)
}

function layerAlert(text){
    layer.alert(text,{
        title: '提示框',
        icon:0
    });
}

$(function(){
    //从localStorage中读取用于生成RSA加密公钥的exponent和modulus
    var exponent = localStorage.getItem("exponent");
    var modulus = localStorage.getItem("modulus");
    if(exponent == null || modulus == null){
        //使用jquery发起ajax请求从服务端获取Rsa加密公钥
        $.ajax({
            type: "POST",
            url: baseURL+"/sys/tool/getRsaPublicKey",
            success: function(r){
                if(r.code == 0){//成功
                    console.log("exponent="+r.exponent);
                    console.log("modulus="+r.modulus);
                    //将用于生成RSA加密公钥的exponent和modulus存放到localStorage
                    localStorage.setItem("exponent",r.exponent);
                    localStorage.setItem("modulus",r.modulus);
                    //根据exponent和modulus生成RSA加密公钥
                    rsaPublicKey = RSAUtils.getKeyPair(r.exponent, '', r.modulus);
                    console.log("根据从服务端获取到的exponent和modulus生成RSA加密公钥");
                    console.log(rsaPublicKey);
                }
            }
        });
    }else{
        if(exponent != null && modulus != null){
            //根据exponent和modulus生成RSA加密公钥
            rsaPublicKey = RSAUtils.getKeyPair(exponent, '', modulus);
            console.log("根据从localStorage获取到的exponent和modulus生成RSA加密公钥");
            console.log(rsaPublicKey);
        }else{
            //使用jquery发起ajax请求从服务端获取Rsa加密公钥
            $.ajax({
                type: "POST",
                url: baseURL+"/sys/tool/getRsaPublicKey",
                success: function(r){
                    if(r.code == 0){//成功
                        console.log("exponent="+r.exponent);
                        console.log("modulus="+r.modulus);
                        //将用于生成RSA加密公钥的exponent和modulus存放到localStorage
                        localStorage.setItem("exponent",r.exponent);
                        localStorage.setItem("modulus",r.modulus);
                        //根据exponent和modulus生成RSA加密公钥
                        rsaPublicKey = RSAUtils.getKeyPair(r.exponent, '', r.modulus);
                        console.log("根据从服务端获取到的exponent和modulus生成RSA加密公钥");
                        console.log(rsaPublicKey);
                    }
                }
            });
        }
    }
});